package com.app.sgd.business.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import com.app.sgd.model.bean.Documento;
import com.app.sgd.model.bean.ExpedienteBCA;
import com.app.sgd.model.bean.Usuario;
import com.app.sgd.plugin.JNDIConnector;
import com.app.sgd.util.Constants;
import com.app.sgd.view.vo.FiltroBusquedaVO;

public class SQLExpedienteDAO {
	private static Logger logger = Logger.getLogger(SQLExpedienteDAO.class);
	
	DataSource ds = null;
	JNDIConnector cn = new JNDIConnector();
	
	public int asociarExpedienteBCA(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		int res = 0;
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
			
	    	String vSQL = "{call std_sp_asociar_exp_bca(?,?,?)}";
	    	call = conn.prepareCall(vSQL);
	    	call.setInt(1,Integer.parseInt(filtroBusquedaVO.getCodDocumento()));
	    	call.setInt(2,Integer.parseInt(filtroBusquedaVO.getExpedienteBCA().getNumeroExpediente()));
	    	call.setString(3,filtroBusquedaVO.getExpedienteBCA().getNumeroExpedienteBCA());
//	    	logger.info("inicio:" + new Date());
	    	res = call.executeUpdate();
//	    	logger.info("fin: " + new Date());	    	
		}catch(Exception e){
			logger.error("[STD]: Error en asociarExpedienteBCA: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return res;
	}
	
	public int actualizarDocumentosExpediente(ArrayList lstDocumentosExpediente, ExpedienteBCA expedienteBCA,Usuario usuario) throws Exception {
		int res = 0;
		OracleExpedienteDAO oracleExpedienteDAO = new OracleExpedienteDAO();
		
		for(Iterator it=lstDocumentosExpediente.iterator();it.hasNext();){
			Documento documento = (Documento)it.next();
			FiltroBusquedaVO filtroBusquedaVO = new FiltroBusquedaVO();
			filtroBusquedaVO.setUsuario(usuario);
			filtroBusquedaVO.setCodDocumento(documento.getCodDocumento());
			filtroBusquedaVO.setExpedienteBCA(expedienteBCA);
			filtroBusquedaVO.setAsunto(formarAsunto(documento));
			filtroBusquedaVO.setFechaEmision(documento.getFechaDocumento());
			filtroBusquedaVO.setNumProveido(documento.getNroRegDocumento());
			try{
				asociarExpedienteBCA(filtroBusquedaVO);
				oracleExpedienteDAO.insertarEstadoExpedienteBCA(filtroBusquedaVO);
			}catch(Exception e){}
		}
		return res;
	}
	
	public int retirarDocumentosExpediente(ArrayList lstDocumentosExpediente, ExpedienteBCA expedienteBCA,Usuario usuario) throws Exception {
		int res = 0;
		OracleExpedienteDAO oracleExpedienteDAO = new OracleExpedienteDAO();	
		for(Iterator it=lstDocumentosExpediente.iterator();it.hasNext();){
			Documento documento = (Documento)it.next();
			FiltroBusquedaVO filtroBusquedaVO = new FiltroBusquedaVO();
			filtroBusquedaVO.setUsuario(usuario);
			filtroBusquedaVO.setCodDocumento(documento.getCodDocumento());
			filtroBusquedaVO.setExpedienteBCA(expedienteBCA);
			filtroBusquedaVO.setAsunto(formarAsunto(documento));
			filtroBusquedaVO.setFechaEmision(documento.getFechaDocumento());
			filtroBusquedaVO.setNumProveido(documento.getNroRegDocumento());
			try{
				asociarExpedienteBCA(filtroBusquedaVO);
			}catch(Exception e){}
		}
		return res;
	}
	
	public String formarAsunto(Documento documento){
		String asunto = documento.getAsunto().trim();
		if(asunto == null || asunto.equals(Constants.VALOR_DEFAULT_VACIO)){
			asunto = "STD - " + documento.getDescMovimiento() + " " + documento.getDescTipoDocumento() + " " + (documento.getNumDocumento().equals(Constants.DOCUMENTO_SIN_NUMERO) ? Constants.VALOR_DEFAULT_VACIO : documento.getNumDocumento()) + 
					 " REG.PROV. " + documento.getNroRegDocumento()+ "<br>" +
					 "DE: "+documento.getDe().trim() + " - " +
					 "PARA: "+documento.getPara().trim() + "<br>" +
					 "ASUNTO: (DOCUMENTO SIN ASUNTO) <br>" ;
		}
		else{
			asunto = "STD - " + documento.getDescMovimiento() + " " + documento.getDescTipoDocumento() + " " + (documento.getNumDocumento().equals(Constants.DOCUMENTO_SIN_NUMERO) ? Constants.VALOR_DEFAULT_VACIO : documento.getNumDocumento()) + 
					 " REG.PROV. " + documento.getNroRegDocumento()+ "<br>" +
					 "DE: "+documento.getDe().trim() + " - " +
					 "PARA: "+documento.getPara().trim() + "<br>" +
					 "ASUNTO: "+documento.getAsunto().trim() + "<br>" ;
		}
		return asunto;
	}
	
	public ArrayList lstDocumentosAsociadosExpediente(int numExpediente) throws Exception {
		ArrayList lstDocumentosExpediente = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
			String vSQL = "{call std_sp_get_docs_asoc_exp (?)}";
	    	
			call = conn.prepareCall(vSQL);
			call.setInt(1,numExpediente);
//			logger.info("ini: " + new Date());
			rs = call.executeQuery();
//            logger.info("fin: " + new Date());
            
            int ind=0;
            while(rs.next()){
            	Documento documento = new Documento();
            	documento.setIndiceDocumento(String.valueOf(ind++));
            	
            	documento.setCodExpedienteBCA(rs.getString("NUMEROEXPEDIENTE"));
            	documento.setNumExpedienteBCA(rs.getString("NUMEROEXPEDIENTEBCA"));
            	documento.setCodDocumento(rs.getString("CODI_DOC_TDOC"));
            	documento.setDescMovimiento(rs.getString("DESC_TMOV_TTM"));
            	documento.setDescTipoDocumento(rs.getString("DESC_TDOC_TTD"));
            	documento.setNumDocumento(rs.getString("NUM_DOC_TDOC"));
            	documento.setAsunto(rs.getString("ASUN_DOC_TDOC"));
            	documento.setDe(rs.getString("NOM_EMI_TDOC"));
            	documento.setPara(rs.getString("NOM_DEST_TDOC"));
            	documento.setFechaDocumento(rs.getString("FECH_DOC_TDOC"));
            	documento.setNroRegDocumento(rs.getString("NRO_REG_TDOC"));

            	lstDocumentosExpediente.add(documento);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en lstDocumentosAsociadosExpediente: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstDocumentosExpediente;
	}
	
	public ArrayList listarDocumentoSinAsociar(FiltroBusquedaVO filtroBusquedaVO) throws Exception {
		ArrayList lstDocumentoSinAsociar = new ArrayList();
		Connection conn = null;
		PreparedStatement pre = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try{
			conn = cn.connect().getConnection();
	    	
			String vSQL = "{call std_sp_lst_docs_sin_asociar (?,?,?,?,?,?,?,?,?)}";
	    	
			call = conn.prepareCall(vSQL);
			call.setString(1,filtroBusquedaVO.getFechaInicio());
			call.setString(2,filtroBusquedaVO.getFechaFin());
			call.setInt(3,Integer.parseInt(filtroBusquedaVO.getCodTipoMovimiento()));
			call.setInt(4,Integer.parseInt(filtroBusquedaVO.getCodTipoDocumento()));
			call.setInt(5,Integer.parseInt(filtroBusquedaVO.getCodOficinaOrigen()));
			call.setInt(6,Integer.parseInt(filtroBusquedaVO.getCodOficinaDestino()));
			call.setString(7,filtroBusquedaVO.getNumDocumento());
			call.setString(8,filtroBusquedaVO.getAsunto());
			call.setInt(9,Integer.parseInt(filtroBusquedaVO.getNumProveido()));
//			logger.info("ini: " + new Date());
			rs = call.executeQuery();
//            logger.info("fin: " + new Date());
            
            int ind=0;
            while(rs.next()){
            	Documento documento = new Documento();
            	documento.setIndiceDocumento(String.valueOf(ind++));
            	
            	documento.setCodExpedienteBCA(rs.getString("NUMEROEXPEDIENTE"));
            	documento.setNumExpedienteBCA(rs.getString("NUMEROEXPEDIENTEBCA"));
            	documento.setCodDocumento(rs.getString("CODI_DOC_TDOC"));
            	documento.setDescMovimiento(rs.getString("DESC_TMOV_TTM"));
            	documento.setDescTipoDocumento(rs.getString("DESC_TDOC_TTD"));
            	documento.setNumDocumento(rs.getString("NUM_DOC_TDOC"));
            	documento.setAsunto(rs.getString("ASUN_DOC_TDOC"));
            	documento.setDe(rs.getString("NOM_EMI_TDOC"));
            	documento.setPara(rs.getString("NOM_DEST_TDOC"));
            	documento.setFechaDocumento(rs.getString("FECH_DOC_TDOC"));
            	documento.setNroRegDocumento(rs.getString("NRO_REG_TDOC"));

            	lstDocumentoSinAsociar.add(documento);
            }
		}catch(Exception e){
			logger.error("[STD]: Error en listarDocumentoSinAsociar: " + e.getMessage());
            e.printStackTrace();
		}
		finally{
			cn.destroy(conn,null,rs,call,pre);
		}
		return lstDocumentoSinAsociar;
	}
}
